package com.ocom.xcxapi.service.impl;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.google.zxing.WriterException;
import com.ocom.common.constant.MapKey;
import com.ocom.common.resp.RespMachMessage;
import com.ocom.common.resp.Result;
import com.ocom.common.utils.*;
import com.ocom.common.vo.human.XfUserInfoVo;
import com.ocom.common.vo.pay.KeySecret;
import com.ocom.xcxapi.client.AccessClientService;
import com.ocom.xcxapi.client.HumanClientService;
import com.ocom.xcxapi.client.SrvpaccessClientService;
import com.ocom.xcxapi.service.AccessService;
import com.ocom.xcxapi.util.NumConvertUtil;
import com.ocom.xcxapi.vo.MenjinGetRecordVo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.io.IOException;
import java.util.Base64;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;


@Slf4j
@Service
public class AccessServiceImpl implements AccessService {

    @Autowired
    private AccessClientService accessClientService;

    @Autowired
    private HumanClientService humanClientService;

    @Autowired
    SrvpaccessClientService srvpaccessClientService;

    /**
     * 2.8.获取用户设备列表 menjin/getMacList
     * */
    @Override
    public Result MenjinGetMacList(Long comId, Long pId) {
        Long userId = pId;
        return accessClientService.SearchMachListByUser(comId,userId);
    }

    /**
     * 2.9.获取设备开门记录 menjin/getRecord
     * */
    @Override
    public Result MenjinGetRecord(MenjinGetRecordVo recordVo) {
        Map<String, Object> map = new HashMap<>();
        MapKey mapKey = new MapKey();
        map.put(mapKey.getKey_comId(),recordVo.getComId());
        map.put(mapKey.getKey_beginTime(),recordVo.getStartTime());
        map.put(mapKey.getKey_endTime(),recordVo.getEndTime());
        map.put(mapKey.getKey_userId(),recordVo.getPId());
        map.put(mapKey.getKey_page(),recordVo.getPage());
        map.put(mapKey.getKey_size(),recordVo.getSize());
        return accessClientService.GetAccessRecord(map);
    }

    /**
     * 2.7.获取二维码 menjin/getCode
     * */
    @Override
    public Result MenjinGetCode(Long comId, Long pId) throws IOException, WriterException {

//
//        try {
//            long date = System.currentTimeMillis();
//            int dateStr = (int) (date / 1000);
//
//            String unixDateFormat = Integer.toHexString(dateStr); // 转成8位16进制数
//
//            byte[] data0ByteT =ByteUtils.hexStr2Bytes(unixDateFormat);
//
//            // 查询单位编码
//            AccountInfoEntity accountInfoEntity = accountInfoService.selectOne(new EntityWrapper<AccountInfoEntity>()
//                    .eq("account", entity.getAccount()).eq("org_code", entity.getOrgCode()));
//            if (accountInfoEntity == null) {
//                throw new SOAException("未找到此用户信息!");
//            }
//
//            String bjStr = "BJ";
//            String orgCode = "     " + entity.getOrgCode();
//            String s1 = orgCode.substring(orgCode.length() - 5);
//            String data0 = bjStr + s1;
//
//            byte[] data0Bytes = new byte[7];
//
//            data0Bytes[0]=bjStr.getBytes()[0];
//            data0Bytes[1]=bjStr.getBytes()[1];
//
//            data0Bytes[2]=s1.getBytes()[0];
//            data0Bytes[3]=s1.getBytes()[1];
//            data0Bytes[4]=s1.getBytes()[2];
//            data0Bytes[5]=s1.getBytes()[3];
//            data0Bytes[6]=s1.getBytes()[4];
//
//            byte[] data1Bytes = new byte[14];
//            byte[] md5KeyBytes = new byte[8];
//
//            String accountStr = "      " + entity.getAccount();
//            String account = accountStr.substring(accountStr.length() - 6);
//            // (后台取account)
//
//            data1Bytes[0] = account.getBytes()[0];// 用户id(account)
//            data1Bytes[1] = account.getBytes()[1];
//            data1Bytes[2] = account.getBytes()[2];
//            data1Bytes[3] = account.getBytes()[3];
//            data1Bytes[4] = account.getBytes()[4];
//            data1Bytes[5] = account.getBytes()[5];
//            int intState=accountInfoEntity.getState();
//            byte bState= (byte) intState;
//            data1Bytes[6] = bState;// 状态是否正常标识
//            int intUser=accountInfoEntity.getUserType();
//            byte bUser= (byte) intUser;
//            data1Bytes[7] = bUser;// 身份类别卡类
//            data1Bytes[8] = data0ByteT[0];// 发码时间戳
//            data1Bytes[9] = data0ByteT[1];
//            data1Bytes[10] = data0ByteT[2];
//            data1Bytes[11] = data0ByteT[3];
//            data1Bytes[12] = 1; // 有效时间跨度20分钟
//            data1Bytes[13] = 0; // 时钟允许误差
//
//            md5KeyBytes[0] = 96;
//            md5KeyBytes[1] = 92;
//            md5KeyBytes[2] = 88;
//            md5KeyBytes[3] = 24;
//            md5KeyBytes[4] = 98;
//            md5KeyBytes[5] = 65;
//            md5KeyBytes[6] = 60;
//            md5KeyBytes[7] = 55;
//
//            // 22位的byte
//            byte[] dataAndMd5Bytes = ByteUtils.addBytes(data0Bytes,data1Bytes, md5KeyBytes);
//            String md5Str = MD5.getMD5(dataAndMd5Bytes);
//            String md5AfterOneStr = md5Str.substring(md5Str.length() - 8);
//
//            //String strMD5 = ByteUtils.str2HexStr(md5AfterOneStr); // 转成8位16进制数
//            byte[] md5AfterTwoByte =ByteUtils.hexStr2Bytes(md5AfterOneStr);
//            byte[] rsaByte = ByteUtils.addBytes(data1Bytes, md5AfterTwoByte);
//            String rsaChars = ByteUtils.bytesToHexFun3(rsaByte);
//            String privateKeyRsa=parameterMapper.selectQrRsa();
//            String content = RSAUtils.encrypt1(rsaChars, privateKeyRsa);
//            String aaa = String.valueOf(ByteUtils.getChars(data0.getBytes()));
//            return aaa +"."+ content;
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
        StringBuilder stringBuilder=new StringBuilder();
        //鑫澳康付款码标识 XAK
        stringBuilder.append("58414b");
        //单位编号 5
        stringBuilder.append(HexStringUtil.IntToHexStringNum(comId.intValue(),10));
        //码类型标识	Int（1）	1-付款码+门禁码，其他预留
        stringBuilder.append("01");
        //卡是否正常标识	Int（1）	bit_0位为门禁标识位，1-正常，允许开门，0-不正常，不允许开门；bit_1位为消费标识位，1-正常，允许消费，0-不正常，不允许消费；
        stringBuilder.append("01");
        //工号	Int（4）	由后台定
        String pIdHex=HexStringUtil.IntToHexStringNum(pId.intValue(),8);
//        stringBuilder.append(NumConvertUtil.reverseHex(pIdHex));
        stringBuilder.append(pIdHex);
//        卡类	Int（1）	16 进制字符，01~FF，即收费类别，比如 FF,表示是 255 卡类
        stringBuilder.append("01");
//        借贷记模式标志	Int（1）	脱机消费时，是否验余额，1-贷记模式（不验余额） 0-借记
        stringBuilder.append("01");
//        模式（要求验余额）
//        单次消费限额	Int（2）	16 进制字符，单位：分，消费大于此值，终端拒绝消费，例
//        如：14 表示 0x14，为 20 分，最大值为 0xFFFF，即 65535 分
        stringBuilder.append("ffff");
//        余额	Int（4）	16 进制字符，单位：分，例如：14 表示 0x14，为 20 分，最
//        大为 0xFFFFFF，即 255*255*255 分

        String money =  "00000000";
        //返回余额
        try {
            Result result = humanClientService.getXfUserInfo(comId,pId);
            if(result.getCode()==200){
                XfUserInfoVo xfUserInfoVo= JSONObject.parseObject(JSON.toJSONString(result.getData()),XfUserInfoVo.class);
                money = NumConvertUtil.IntToHexStringNum(xfUserInfoVo.getChargeBalance().intValue(),8);
            }

        }catch (Exception e){
            log.info("获取余额 【{}】" ,e);
        }

        stringBuilder.append(money);
//        发码时间戳	Int（4）	Unix 时间戳
        String timestamp = String.valueOf(new Date().getTime()/1000);
        stringBuilder.append(NumConvertUtil.IntToHexStringNum(Integer.valueOf(timestamp),8));         // new Date()为获取当前系统时间
//        有效时间跨度	Int（1）	16 进制字符，单位：分钟，例如：14 表示 0x14，为 20 分钟，
//        最大为 0xFFFF，即 255*255, 二维码有效期  A= 发码时间戳+ 有效时间跨度 *60
        stringBuilder.append("02");
//        时钟允许误差	Int（1）	判断二维码生成时间是否有效的误差允许值，单位为秒，默认 5 秒
        stringBuilder.append("0a");


//        String data2= MD5.MD5Encode(stringBuilder.substring(6),"utf8");
        String data2= stringBuilder.substring(6);


        String secKey = "EBAB7A0EEC89A627CF21595EAC64295307CC28CF02F3B284C8707A0638F4D609";

        try {
            RespMachMessage respMachMessage = srvpaccessClientService.getDecodeKey(comId,"",3);
            if(respMachMessage.getCode().equals("0000")){
                KeySecret secret = JSON.parseObject(JSON.toJSONString(respMachMessage.getData()), KeySecret.class);
                secKey=secret.getSecret().get("private_pri");
            }
        }catch (Exception e){
            log.info("获取密钥异常",e);
        }
        if(CommonUtil.isNull(secKey)){
            secKey = "EBAB7A0EEC89A627CF21595EAC64295307CC28CF02F3B284C8707A0638F4D609";
        }

        String url = "http://120.78.153.235:20000/o2api/Api/MenJin/GetJavaQRCode?key="+secKey+"&data="+data2;

        String tt = HttpRequest.sendGet(url);

//        签名数据	Int（64）	长度为 64字节的 SM2 私钥签名数据
     //   stringBuilder.append("11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111");
        stringBuilder.append(tt.replace("\"",""));

        ;

//        byte[] stringByte222 = NumConvertUtil.hexStringToByte(stringBuilder.toString());

        log.info("个人二维码:【{}】【{}】【{}】",data2,tt,stringBuilder);

        String code64=QRCodeUtil.createQRCode(Base64.getEncoder().encodeToString(NumConvertUtil.hexStringToByte(stringBuilder.toString())),600,600);
        return ResultUtil.success(code64);
    }

    public static void main(String[] args){
        String url = "http://120.78.153.235:20000/o2api/Api/MenJin/GetJavaQRCode?key=EBAB7A0EEC89A627CF21595EAC64295307CC28CF02F3B284C8707A0638F4D609&data=000000002701010001b9490101ffff000129a863646542050a";
        String tt = HttpRequest.sendGet(url);
        System.out.println(tt);
        StringBuilder stringBuilder=new StringBuilder();

        byte[] bytes = NumConvertUtil.hexStringToByte("58414b000000002701010001fe780101ffff000000006363a30f050a659BE7CABF71DD37F51C20A98A190C9D7EC111C238E44C4223F5F3EBBB9BDCC7549005BED9A499DD6007BFF3E3B2900F9D28659ADD85939B8E653B3671496C59");
        System.out.println(tt);

        String uu = Base64.getEncoder().encodeToString(bytes);;
        System.out.println(uu);

//        System.out.println(NumConvertUtil.bytesToHexString(str.getBytes(StandardCharsets.UTF_8)));


    }




}
